package com.auto.survey.util.monitoring.entity

import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
import com.auto.survey.activity.monitoring.entity.MonitoringStation

/**
 * 后方交会计算结果数据类
 * 存储通过后方交会算法计算得到的测站坐标及精度评定结果
 */

/**
 * 后方交会计算结果数据类
 * 存储通过后方交会算法计算得到的测站坐标、精度评定结果及验证信息
 */
@Entity(
    tableName = "MonitoringStationCalculationResult",
    foreignKeys = [
        ForeignKey(
            entity = MonitoringStation::class,
            parentColumns = ["id"],
            childColumns = ["stationId"],
            onDelete = ForeignKey.Companion.CASCADE
        )
    ],
    indices = [Index(value = ["stationId"])]
)
data class RearIntersectionCalculationResult(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    var stationId: Int = -1,
    /** 计算得到的测站X坐标（平面直角坐标系，单位：米） */
    val stationX: Double,

    /** 计算得到的测站Y坐标（平面直角坐标系，单位：米） */
    val stationY: Double,

    /** 计算得到的测站Z坐标（高程，单位：米） */
    val stationZ: Double,

    /** X方向点位中误差（单位：米），表征X坐标的精度 */
    val mx: Double,

    /** Y方向点位中误差（单位：米），表征Y坐标的精度 */
    val my: Double,

    /** Z方向点位中误差（单位：米），表征高程的精度 */
    val mz: Double,

    /** 平面点位中误差（单位：米），表征平面位置的综合精度（√(mx²+my²)） */
    val mxy: Double,

    /** 三维点位中误差（单位：米），表征空间位置的综合精度（√(mx²+my²+mz²)） */
    val mxyz: Double,

    /** 迭代计算次数，反映算法收敛速度 */
    val iterationCount: Int,

    /** 计算是否收敛标志（true表示收敛，false表示未收敛） */
    val isConverged: Boolean,

    /** 所有控制点是否均通过验证的标志（true表示全部通过） */
    val isVerificationPassed: Boolean,

    /** 是否符合三等平面控制测量精度标准的标志 */
    val isThirdOrderStandardMet: Boolean,

    /** 单位权中误差（单位：米），表征观测值的整体精度 */
    val meanSquareErrorOfUnitWeight: Double,

    /** 多余观测数（观测数 - 未知数个数），反映观测冗余度 */
    val redundancy: Int,

    /** 测站到所有控制点的总距离（单位：米） */
    val totalDistance: Double,

    /** 测站到控制点的平均距离（单位：米） */
    val meanDistance: Double,

    /** 最大距离差值（单位：米），反映距离验证的极端偏差 */
    val maxDistanceDifference: Double,

    /** 最大水平角差值（单位：弧度），反映角度验证的极端偏差 */
    val maxAngleDifference: Double,

    /** 最大天顶距差值（单位：弧度），反映垂直角验证的极端偏差 */
    val maxZenithAngleDifference: Double
)